package cn.tang.tframe.sdm.enums;

import cn.tang.tframe.common.enums.BaseNumEnum;
import cn.tang.tframe.common.utils.lang.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 全局用户身份枚举
 * 二进制位表示身份,每一位表示一个身份
 * 根据用户身份数值和GlobalTagEnum中每一位表示的身份进行运算判断是否有身份
 * 比如:用户身份数值为x,判断是否是老师可以使用 x&GlobalTagEnum.teacher == GlobalTagEnum.teacher
 * 判断是老师又是家长可以使用x&(GlobalTagEnum.teacher|GlobalTagEnum.parent) == (GlobalTagEnum.teacher|GlobalTagEnum.parent)
 */
public enum GlobalTagEnum  implements BaseNumEnum {
	teacher(1 << 0,"教师")
	,parent(1 << 1,"家长")
	,student(1 << 2,"学生")
	,educational(1 << 3,"教育机构")
	,schoolFriend(1 << 4,"校外人士")
	,schoolManager(1 << 5,"学校管理员")
	,schoolWorker(1 << 6,"学校教职工(非教师)")
	;

	private int num ;
	private String key ;


	private GlobalTagEnum(int num, String key){
		this.num = num;
		this.key = key;
	}
	@Override
	public int getNum(){
		return num;
	}
	@Override
	public String getKey() {
		return key;
	}

	public static Integer fromEnumsToNum(List<GlobalTagEnum> tags){
		if(CollectionUtils.isEmpty(tags)){
			return null;
		}
		int i = 0;
		for(GlobalTagEnum tag: tags){
			i |= tag.getNum();
		}
		return i;
	}
	public static List<GlobalTagEnum> fromNumToEnums(Integer i){
		if(null == i || i == 0){
			return null;
		}
		List<GlobalTagEnum> enums = new ArrayList<>();
		GlobalTagEnum[] values = GlobalTagEnum.values();
		for(GlobalTagEnum globalTagEnum: values){
			if(hasTag(i,globalTagEnum)){
				enums.add(globalTagEnum);
			}
		}
		return enums;
	}
	public static boolean hasTag(Integer i, GlobalTagEnum tag){
		if(null == i){
			return false;
		}
		return (i & tag.getNum()) > 0;
	}
}
